/* -*-jde-*- */
package app.usuario.beans;

import app.conexion.Conexion;
import app.conexion.ConexionException;
import app.util.SQLInjectionException;
import app.util.Validator;
import app.util.appException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Bean Dirección La dirección asignada al usuario
 *
 * @author Victor Miguel Peralta Santa Anna
 * @since Diciembre 2011
 * @version 0.1
 */
public class Direccion {

    /**
     * El identificador para la dirección
     */
    private int nIdDireccion;
    /**
     * El identificador del usuario
     */
    private int nIdUsuario;
    /**
     * El estado para la dirección
     */
    private String sEstado;
    /**
     * La ciudad para la dirección
     */
    private String sCiudad;
    /**
     * La calle para la dirección
     */
    private String sCalle;
    /**
     * El número exterior de la dirección
     */
    private String sNumeroExterior;
    /**
     * El número interior de la dirección
     */
    private String sNumeroInterior;
    /**
     * La colonia de la dirección;
     */
    private String sColonia;
    /**
     * La delegación de la dirección
     */
    private String sDelegacion;
    /**
     * El código postal para la dirección
     */
    private String sCodigoPostal;

    /**
     * El contructor de la dirección
     *
     * @param nIdDireccion
     * @param nIdUsuario
     * @param sEstado
     * @param sCiudad
     * @param sCalle
     * @param sNumeroExterior
     * @param sNumeroInterior
     * @param sColonia
     * @param sDelegacion
     * @param sCodigoPostal
     */
    public Direccion(int nIdDireccion, int nIdUsuario, String sEstado,
            String sCiudad, String sCalle, String sNumeroExterior,
            String sNumeroInterior, String sColonia, String sDelegacion,
            String nCodigoPostal) {
        this.nIdDireccion = nIdDireccion;
        this.nIdUsuario = nIdUsuario;
        this.sEstado = sEstado;
        this.sCiudad = sCiudad;
        this.sCalle = sCalle;
        this.sNumeroExterior = sNumeroExterior;
        this.sNumeroInterior = sNumeroInterior;
        this.sColonia = sColonia;
        this.sDelegacion = sDelegacion;
        this.sCodigoPostal = nCodigoPostal;
    }

    @Override
    public String toString() {
        return "Direccion{" + "nIdUsuario=" + nIdUsuario + ", sEstado=" + sEstado
                + ", sCiudad=" + sCiudad + ", sCalle=" + sCalle
                + ", sNumeroExterior=" + sNumeroExterior + ", sNumeroInterior="
                + sNumeroInterior + ", sColonia=" + sColonia + ", sDelegacion="
                + getsDelegacion() + ", nCodigoPostal=" + sCodigoPostal + '}';
    }

    /**
     * @return the nIdUsuario
     */
    public int getnIdUsuario() {
        return nIdUsuario;
    }

    /**
     * @return the sEstado
     */
    public String getsEstado() {
        return sEstado;
    }

    /**
     * @return the sCiudad
     */
    public String getsCiudad() {
        return sCiudad;
    }

    /**
     * @return the sCalle
     */
    public String getsCalle() {
        return sCalle;
    }

    /**
     * @return the sNumeroExterior
     */
    public String getsNumeroExterior() {
        return sNumeroExterior;
    }

    /**
     * @return the sNumeroInterior
     */
    public String getsNumeroInterior() {
        return sNumeroInterior;
    }

    /**
     * @return the sColonia
     */
    public String getsColonia() {
        return sColonia;
    }

    /**
     * @return the nCodigoPostal
     */
    public String getsCodigoPostal() {
        return sCodigoPostal;
    }

    /**
     * @return the nIdDireccion
     */
    public int getnIdDireccion() {
        return nIdDireccion;
    }

    /**
     * @param sEstado the sEstado to set
     */
    public void setsEstado(String sEstado) {
        this.sEstado = sEstado;
    }

    /**
     * @param sCiudad the sCiudad to set
     */
    public void setsCiudad(String sCiudad) {
        this.sCiudad = sCiudad;
    }

    /**
     * @param sCalle the sCalle to set
     */
    public void setsCalle(String sCalle) {
        this.sCalle = sCalle;
    }

    /**
     * @param sNumeroExterior the sNumeroExterior to set
     */
    public void setsNumeroExterior(String sNumeroExterior) {
        this.sNumeroExterior = sNumeroExterior;
    }

    /**
     * @param sNumeroInterior the sNumeroInterior to set
     */
    public void setsNumeroInterior(String sNumeroInterior) {
        this.sNumeroInterior = sNumeroInterior;
    }

    /**
     * @param sColonia the sColonia to set
     */
    public void setsColonia(String sColonia) {
        this.sColonia = sColonia;
    }

    /**
     * @return the sDelegacion
     */
    public String getsDelegacion() {
        return sDelegacion;
    }

    /**
     * @param sDelegacion the sDelegacion to set
     */
    public void setsDelegacion(String sDelegacion) {
        this.sDelegacion = sDelegacion;
    }

    /**
     * @param nCodigoPostal the sCodigoPostal to set
     */
    public void setsCodigoPostal(String sCodigoPostal) {
        this.sCodigoPostal = sCodigoPostal;
    }

    /**
     * Guarda el objeto en la base de datos independientemente si éste es nuevo
     * o no.
     */
    public void save() throws appException, ConexionException {

        try {

            Conexion con = new Conexion();

            String query = "select ";
            if (nIdDireccion == -1) {
                query += "addDireccion(" + nIdUsuario + "";
                query += ", '" + sEstado + "'";
                query += ", '" + sCiudad + "'";
                query += ", '" + sCalle + "'";
                query += ", '" + sNumeroExterior + "'";
                query += ", '" + sNumeroInterior + "'";
                query += ", '" + sColonia + "'";
                query += ", '" + sDelegacion + "'";
                query += ", '" + sCodigoPostal + "'";
                query += ");";

                if (!Validator.checkSQLInjection(query)) {
                    ResultSet r = con.exec(query);
                    while (r.next()) {
                        int resultado = r.getInt("addDireccion");
                        this.nIdDireccion = resultado;
                    }
                }

            } else {
                query += "updateDireccion(" + nIdDireccion + "";
                query += ", '" + sEstado + "'";
                query += ", '" + sCiudad + "'";
                query += ", '" + sCalle + "'";
                query += ", '" + sNumeroExterior + "'";
                query += ", '" + sNumeroInterior + "'";
                query += ", '" + sColonia + "'";
                query += ", '" + sDelegacion + "'";
                query += ", '" + sCodigoPostal + "'";
                query += ");";

                con.exec(query);
            }

            con.close();
        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudo guardar el elemento: Dirección");
        } catch (SQLException sqle) {
            System.err.println(sqle);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, sqle);
            throw new appException("No se pudo guardar el elemento: Dirección");
        } catch (SQLInjectionException sqlie) {
            System.err.println(sqlie);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, sqlie);
            throw new appException(sqlie.getMessage());
        }
    }

    /**
     * Borra el objeto de la base de datos.
     */
    public void delete() throws appException {
        try {
            Conexion con = new Conexion();
            String query = "select deleteDireccion( " + nIdDireccion + " );";
            con.exec(query);
            con.close();
        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudo borrar el elemento: Dirección");
        }
    }

    /**
     * Conexiones de prueba a la base de datos
     *
     * @param args
     * @throws ConexionException
     * @throws SQLException
     * @throws appException
     */
    public static void main(String args[]) throws ConexionException, SQLException, appException {


        //nuevo
        Direccion d = new Direccion(-1, 1, "Estado modificado", "Ciudad", "calle", "exterior", "Interior", "Colonia", "delegacion", "16200");

        d.save();
        // existente
        //Usuario u = new Usuario(2, "nuevo usuario", "washa washa", false, 'a');
        //tc.setsTipocontratacion("a");
        //u.save();

        //d.delete();



        //System.out.println(d);
    }
}
